// ==UserScript==
// @name        The West - Raccourcis [SOM] [BETA] - (multilingue)
// @description The West - Raccourcis [SOM - Scripts-O-Maniacs] [BETA] - (multilingue)
// @author      Gzahab
// @author      Danosaure
// @namespace   http://scripts-o-maniacs.leforum.eu/
// @include     http://*.the-west.*/game.php*
// @include     http://userscripts.org/scripts/review/111503*
// @include     http://userscripts.org/scripts/source/111503.meta.js*
// @version     1.33i
// @copyright   2011, Danosaure (http://scripts-o-maniacs.leforum.eu/)
// @copyright   2011, Gzahab (http://www.gzahab.fr)
// @website     http://scripts-o-maniacs.leforum.eu
// @licence     (CC); http://creativecommons.org/licenses/by-nc/2.0/fr/
//
// @history     1.33i|2011.12.25    Utilisation SOM-Tools.
// @history     1.33h|2011.12.15    Correction nom variable.
// @history     1.33g|2011.12.15    Correction affichage temps marchand lorsque changement menu.
// @history     1.33f|2011.12.15    Correction temps marchand.
// @history     1.33e|2011.12.12    Personnalisation icônes.
// @history     1.33d|2011.12.04    Rien afficher si pas artisanat.
// @history     1.33c|2011.12.04    Afficher points artisanat.
// @history     1.33b|2011.12.03    Correction anciens buildings.
// @history     1.33a|2011.12.03    Adaptation pour serveur version 1.34.
// @history     1.33    Passage de la version 1.32e en production.
// @history     1.32e   Correct sur le DOMready.
// @history     1.32d   Réusinage code javascript.
// @history     1.32c   Correction contour du marchand.
// @history     1.32b   Correction artisanat SDF. Artisanat personnalisé.
// @history     1.32a   Correction pour v1.33 cityhall.
// @history     1.32    Nouvelle fenêtre pour l'artisanat.
// @history     1.31b   Arrivée de la fenêtre de configuration (config de la bordure et du fond de case)
// @history     1.31a   Déplacement barre raccourcis du haut_droite suite icône buff + icône artisan
// @history     1.29l-O Correctif erreur addEvent dans le chgt image ville
// @history     1.29l-N Correctif décompte marchand sous chrome
// @history     1.29l-M Ultime tentative de correction du 59 min après l'ouverture du marchand
// @history     1.29l-L Nouvelle tentative de correction du 59 min après l'ouverture du marchand
// @history     1.29l-K Correction du 59 min après l'ouverture du marchand en automatique
// @history     1.29l-J Nouveau système de récupération du temps du marchand
// @history     1.29l-H Les boutons sont multi-langue
// @history     1.29l-H Les mises à jour devraient marcher avec différents scripts
// @history     1.29l-G Correctif pour Chrome qui contient le terme "safari"
// @history     1.29l-F Différenciation entre safari et les autres qui fonctionnent avec le meta.js
// @history     1.29l-E Pop-up pour les gens sur safari si besoin màj
// @history     1.29l-E Amélioration du code de la partie màj
// @history     1.29l-D Fermeture de la fenêtre lorsque l'on clique sur installer
// @history     1.29l-C Gestion de mise à jour normalement complet (sauf la langue)
// @history     1.29l-C Changement des variables de stockage
// @history     1.29l-B Correctif pour safari (merci Dun)
// @history     1.29l-A Fenêtre type TW
// @history     1.29l   Mise en place de la mise à jour en automatique indépendante
// @history     1.29k   Correctif décompte à 2 h + commentaire case réglage
// @history     1.29j   Ajout décompte marchand ambulant + correctif icône marchand sur la beta
// @history     1.29i   Correction barre pour SDF + ajout position centrée + ajout icône marchand et profil + sauvegarde position
// @history     1.29h   Ajout de la flèche de déplacement

// ==/UserScript==

// $Revision: 113 $
// $Date:: 2011-12-27 18:55:43 #$
// Numéros du script: prod:109737 beta:111503

//Cas du script exécuté dans le jeu (ou exclusiment fenêtre principale : "game.php#")
if (
        (window.location.href.indexOf(".the-west.") != -1)
        && (window.location.href.indexOf("game.php") != -1)) {

    //Création d'une fonction globale pour tout le script
    (
        function(fonctionGZA) {
            var scriptGZA = document.createElement('script');
            scriptGZA.type = 'application/javascript';
            scriptGZA.textContent = '(' + fonctionGZA.toString() + ')()';
            (document.body||document.head||document.documentElement).appendChild(scriptGZA);
            scriptGZA.parentNode.removeChild(scriptGZA)
        }
    )(
        function() {
            /////////////////////////////////////////////////////////
            //
            // PROGRAMME PRINCIPAL
            //
            /////////////////////////////////////////////////////////

            //Création d'une fonction globale pour éviter un pb de timedout
            var programme_principal = function() {
                if (typeof(SOM) == 'undefined') {
                    var ouvrir_lien_script = function() {
                        try {
                            var navigateur = navigator.userAgent.toLowerCase();
                            if ((navigateur.indexOf('chrome') == -1)
                                    && (navigateur.indexOf('safari') != -1)) {
                                window.open('http://userscripts.org/scripts/show/120825');
                            } else {
                                location.href = 'http://userscripts.org/scripts/source/120825.user.js';
                            }
                        } catch (e) {
                        }
                    };

                    var contenant = document.createElement('div');

                    var div = document.createElement('div');
                    contenant.appendChild(div);

                    var p = document.createElement('p');
                    p.appendChild(document.createTextNode("This script requires:"));
                    div.appendChild(p);

                    p = document.createElement('p');
                    p.style.textAlign = 'center';
                    p.style.fontWeight = 'bold';
                    p.appendChild(document.createTextNode("The West - Common tools [SOM]"));
                    div.appendChild(p);

                    p = document.createElement('p');
                    p.appendChild(document.createTextNode("Install?"));
                    div.appendChild(p);

                    showMessage(
                        /*content*/ contenant,
                        /*header*/  "SOM-Tools Dependancy Missing",
                        /*width*/   500,
                        /*height*/  undefined,
                        /*options*/ [ ['Yes', ouvrir_lien_script], ['No'] ]
                        );

                    return;
                }

                // Create SOM-Shortcuts specific object container.
                if (typeof(SOM.Shortcuts) != 'undefined') {
                    // There may be a conflict with another script.
                    new HumanMessage("Conflicting loading. Disable other versions of this script.");
                    return;
                }

                // This script has not been loaded yet.
                SOM.Shortcuts = Object();


                /////////////////////////////////////////////////////////
                //
                // DÉCLARATION DES CONSTANTES
                //
                /////////////////////////////////////////////////////////

                //MISE À JOUR
                SOM.Shortcuts.VERSION = "1.33i";
                SOM.Shortcuts.NUMERO_SCRIPT = "111503";
                SOM.Shortcuts.DELTA_maj = 24 * 3600; // 24 h en s

                // Positions possibles du cadre.
                SOM.Shortcuts.POSITIONS = new Object();
                SOM.Shortcuts.POSITIONS.defaut = 'haut_gauche';
                SOM.Shortcuts.POSITIONS.haut_gauche = new Object();
                SOM.Shortcuts.POSITIONS.haut_gauche.position = 'top:6px; left:33px;';       // collé au menu de gauche à côté de "ville"
                SOM.Shortcuts.POSITIONS.haut_gauche.style = '0px 0px';
                SOM.Shortcuts.POSITIONS.haut_gauche.next = 'haut_centre';
                SOM.Shortcuts.POSITIONS.haut_centre = new Object();
                SOM.Shortcuts.POSITIONS.haut_centre.position = 'top:6px; left:50%;';
                SOM.Shortcuts.POSITIONS.haut_centre.style = '0px 0px';
                SOM.Shortcuts.POSITIONS.haut_centre.next = 'haut_droite';
                SOM.Shortcuts.POSITIONS.haut_droite = new Object();
                SOM.Shortcuts.POSITIONS.haut_droite.position = 'top:48px; right:35px;';     //collé au menu de droite à côté de "Travailler"
                SOM.Shortcuts.POSITIONS.haut_droite.style = '20px 0px';
                SOM.Shortcuts.POSITIONS.haut_droite.next = 'bas_droite';
                SOM.Shortcuts.POSITIONS.bas_droite = new Object();
                SOM.Shortcuts.POSITIONS.bas_droite.position = 'bottom:128px; right:15px;';  // collé au dessus de la croix "réglages cartes"
                SOM.Shortcuts.POSITIONS.bas_droite.style = '20px 0px';
                SOM.Shortcuts.POSITIONS.bas_droite.next = 'bas_centre';
                SOM.Shortcuts.POSITIONS.bas_centre = new Object();
                SOM.Shortcuts.POSITIONS.bas_centre.position = 'bottom:86px; left:50%;';  // collé au dessus de la croix "réglages cartes"
                SOM.Shortcuts.POSITIONS.bas_centre.style = '20px 20px';
                SOM.Shortcuts.POSITIONS.bas_centre.next = 'bas_gauche';
                SOM.Shortcuts.POSITIONS.bas_gauche = new Object();
                SOM.Shortcuts.POSITIONS.bas_gauche.position = 'bottom:98px; left:12px;';
                SOM.Shortcuts.POSITIONS.bas_gauche.style = '0px 20px';
                SOM.Shortcuts.POSITIONS.bas_gauche.next = 'haut_gauche';

                SOM.Shortcuts.ICONES = new Object();
                SOM.Shortcuts.ICONES.DEFAUT = { bank:true, church:true, cityhall:true, crafting:true, fingerboard:true, general:true, gunsmith:true, hotel:true, invitation:true, market:true, merchant:true, mortician:true, profile:true, saloon:true, sheriff:true, tailor:true };
                SOM.Shortcuts.ICONES.AVEC_VILLE = new Array('gunsmith', 'tailor', 'general', 'hotel', 'bank', 'church', 'mortician', 'cityhall', 'saloon', 'sheriff', 'market', 'merchant', 'fingerboard', 'profile', 'crafting');
                SOM.Shortcuts.ICONES.SANS_VILLE = new Array('invitation', 'merchant', 'profile', 'crafting');
                SOM.Shortcuts.ICONES.bank        = { name:'building_bank',      image:'images/items/yield/bag.png' };
                SOM.Shortcuts.ICONES.church      = { name:'building_church',    image:'images/items/neck/mini/cross_bronze.png' };
                SOM.Shortcuts.ICONES.cityhall    = { name:'building_cityhall',  image:'images/bank/city.png' };
                SOM.Shortcuts.ICONES.crafting    = { name:'crafting',           image:'images/items/recipe/recipe_smith.png' };
                // Utiliser l'image de la profession du joueur.
                switch (Character.profession) {
                    case 1: SOM.Shortcuts.ICONES.crafting.image = 'images/items/recipe/recipe_cook.png'; break;
                    case 2: SOM.Shortcuts.ICONES.crafting.image = 'images/items/recipe/recipe_quack.png'; break;
                    case 3: SOM.Shortcuts.ICONES.crafting.image = 'images/items/recipe/recipe_smith.png'; break;
                    case 4: SOM.Shortcuts.ICONES.crafting.image = 'images/items/recipe/recipe_sattle.png'; break;
                }
                SOM.Shortcuts.ICONES.fingerboard = { name:'fingerboard',        image:'images/items/yield/flag.png' };
                SOM.Shortcuts.ICONES.general     = { name:'building_general',   image:'images/items/neck/mini/kerchief_blue.png' };
                SOM.Shortcuts.ICONES.gunsmith    = { name:'building_gunsmith',  image:'images/items/right_arm/mini/deringer_accurate.png' };
                SOM.Shortcuts.ICONES.hotel       = { name:'building_hotel',     image:'images/items/right_arm/mini/pillow.png' };
                SOM.Shortcuts.ICONES.invitation  = { name:'invitations',        image:'images/items/yield/letter.png' };
                SOM.Shortcuts.ICONES.market      = { name:'building_market',    image:'images/items/yield/stolen_goods.png' };
                SOM.Shortcuts.ICONES.merchant    = { name:'item_trader',        image:'images/itemtrader/haendler_btn.jpg' };
                SOM.Shortcuts.ICONES.mortician   = { name:'building_mortician', image:'images/items/yield/testament.png' };
                SOM.Shortcuts.ICONES.profile     = { name:'profile',            image:'images/items/yield/photo.png' };
                SOM.Shortcuts.ICONES.saloon      = { name:'building_saloon',    image:'images/items/yield/beer.png' };
                SOM.Shortcuts.ICONES.sheriff     = { name:'building_sheriff',   image:'images/items/yield/sheriffstar.png' };
                SOM.Shortcuts.ICONES.tailor      = { name:'building_tailor',    image:'images/items/body/mini/tuetue.png' };
                // misc icons
                SOM.Shortcuts.ICONES.bag         = { image:'images/inventory/bag.png' };
                SOM.Shortcuts.ICONES.cancel      = { image:'images/icons/cancel.png' };
                SOM.Shortcuts.ICONES.config      = { image:'images/items/yield/picture.png' };
                SOM.Shortcuts.ICONES.empty       = { image:'images/transparent.png' };
                SOM.Shortcuts.ICONES.map_arrow   = { image:'images/main/map_arrows.png' };
                SOM.Shortcuts.ICONES.ok          = { image:'images/icons/accept.png' };
                // borders
                SOM.Shortcuts.ICONES.BORDURE     = { true:'2px solid green', false:'2px solid red' };

                //CADRE
                SOM.Shortcuts.CADRE_BORDURE_DEFAUT = '2px solid #3B240B';
                SOM.Shortcuts.CADRE_image_carre = 40;                     // taille côté du carré (43 x 43 par exemple)
                SOM.Shortcuts.CADRE_image_fleche = SOM.Shortcuts.CADRE_image_carre / 2;     // taille d'une flèche

                //Le n° du joueur est intégré dans les noms des variables
                SOM.Shortcuts.StorageNames = new Object();
                SOM.Shortcuts.StorageNames['CASE'] = 'SOM_SHORTCUTS_CASE_' + Character.playerId;
                SOM.Shortcuts.StorageNames['POSITION'] = 'SOM_SHORTCUTS_POSITION_' + Character.playerId;
                SOM.Shortcuts.StorageNames['BORDURE'] = 'SOM_SHORTCUTS_BORDURE_' + Character.playerId;
                SOM.Shortcuts.StorageNames['MAJ'] = 'SOM_SHORTCUTS_' + SOM.Shortcuts.NUMERO_SCRIPT + '_MAJ';
                SOM.Shortcuts.StorageNames['ANNULER'] = 'SOM_SHORTCUTS_ANNULER';
                SOM.Shortcuts.StorageNames['CHERCHER'] = 'SOM_SHORTCUTS_CHERCHER';
                SOM.Shortcuts.StorageNames['ICONES'] = 'SOM_SHORTCUTS_ICONES_' + Character.playerId;
                SOM.Shortcuts.OldStorageNames = new Object();
                SOM.Shortcuts.OldStorageNames['CASE'] = 'GZA_' + SOM.Shortcuts.NUMERO_SCRIPT + '_CASE' + Character.playerId;
                SOM.Shortcuts.OldStorageNames['POSITION'] = 'GZA_' + SOM.Shortcuts.NUMERO_SCRIPT + '_POSITION' + Character.playerId;
                SOM.Shortcuts.OldStorageNames['BORDURE'] = 'GZA_' + SOM.Shortcuts.NUMERO_SCRIPT + '_BORDURE' + Character.playerId;
                SOM.Shortcuts.OldStorageNames['MAJ'] = "GZA_" + SOM.Shortcuts.NUMERO_SCRIPT + "_MAJ";
                SOM.Shortcuts.OldStorageNames['ANNULER'] = "GZA_" + SOM.Shortcuts.NUMERO_SCRIPT + "_ANNULER";
                SOM.Shortcuts.OldStorageNames['CHERCHER'] = "GZA_" + SOM.Shortcuts.NUMERO_SCRIPT + "_CHERCHER";
                SOM.Shortcuts.OldStorageNames['ICONES'] = 'GZA_' + SOM.Shortcuts.NUMERO_SCRIPT + '_ICONES_' + Character.playerId;

                var OUVRE_MARCHAND_VIEUX = "AjaxWindow.show('" + SOM.Shortcuts.ICONES.merchant.name + "', {action:'index', h:h});";
                var OUVRE_MARCHAND = 'Trader.open("' + SOM.Shortcuts.ICONES.merchant.name + '");';

                id_fleche_url = "id_fleche_url";
                id_fleche_style = "id_fleche_style";


                /////////////////////////////////////////////////////////
                //
                // INITIALISATION DES VARIABLES
                //
                /////////////////////////////////////////////////////////
                var heure_prochain_changement_marchand = "";
                var contenu_ItemTraderpage_setTime = "";

                /////////////////////////////////////////////////////////
                //
                // FONCTIONS
                //
                /////////////////////////////////////////////////////////

                SOM.Shortcuts.inserer_icone = function(compteur, identifiant) {
                    switch (identifiant) {
                        case 'bank':
                            SOM.Shortcuts.ajoute_icone_building_vieux(compteur, 'bank');
                            break;
                        case 'church':
                            SOM.Shortcuts.ajoute_icone_Church(compteur);
                            break;
                        case 'cityhall':
                            SOM.Shortcuts.inserer_icone_image(compteur, 'cityhall', "CityhallWindow.open(" + Character.home_town.town_id + ");");
                            break;
                        case 'crafting':
                            SOM.Shortcuts.ajoute_icone_Crafting(compteur);
                            break;
                        case 'fingerboard':
                            SOM.Shortcuts.ajoute_icone_building_vieux(compteur, 'fingerboard');
                            break;
                        case 'general':
                            SOM.Shortcuts.ajoute_icone_Trader(compteur, 'general');
                            break;
                        case 'gunsmith':
                            SOM.Shortcuts.ajoute_icone_Trader(compteur, 'gunsmith');
                            break;
                        case 'hotel':
                            SOM.Shortcuts.ajoute_icone_Hotel(compteur);
                            break;
                        case 'invitation':
                            SOM.Shortcuts.inserer_icone_image(compteur, 'invitation', 'AjaxWindow.show("invitations");');
                            break;
                        case 'market':
                            SOM.Shortcuts.ajoute_icone_Market(compteur);
                            break;
                        case 'merchant':
                            SOM.Shortcuts.ajoute_icone_marchand(compteur);
                            break;
                        case 'mortician':
                            SOM.Shortcuts.ajoute_icone_Mortician(compteur);
                            break;
                        case 'profile':
                            SOM.Shortcuts.inserer_icone_image(compteur, 'profile', 'AjaxWindow.show("profile", {char_id:' + Character.playerId + '}, ' + Character.playerId + ');');
                            break;
                        case 'saloon':
                            SOM.Shortcuts.ajoute_icone_building_vieux(compteur, 'saloon');
                            break;
                        case 'sheriff':
                            SOM.Shortcuts.ajoute_icone_building_vieux(compteur, 'sheriff');
                            break;
                        case 'tailor':
                            SOM.Shortcuts.ajoute_icone_Trader(compteur, 'tailor');
                            break;
                        case 'config':
                            SOM.Shortcuts.ajoute_case_config(compteur);
                            break;
                        case 'map_arrows':
                            SOM.Shortcuts.ajoute_fleche(compteur, "javascript:SOM.Shortcuts.deplace_barre('haut_centre');");
                            break;
                    }
                };

                SOM.Shortcuts.generer_menu_raccourcis = function() {
                    var menu = $('menu_raccourcis');
                    if (menu == null) {
                        return;
                    }

                    // Empty menu.
                    while (menu.hasChildNodes()) {
                        menu.removeChild(menu.firstChild);
                    }

                    var donnees = SOM.Shortcuts.getItem('ICONES', SOM.Shortcuts.ICONES.DEFAUT);
                    var icones;
                    if (Character.home_town == null) {
                        icones = SOM.Shortcuts.ICONES.SANS_VILLE;
                    } else {
                        icones = SOM.Shortcuts.ICONES.AVEC_VILLE;
                    }
                    var compteur = 0;
                    for (var i = 0; i < icones.length; i++) {
                        if (donnees[icones[i]]) {
                            SOM.Shortcuts.inserer_icone(compteur, icones[i]);
                            compteur++;
                        }
                    }
                    SOM.Shortcuts.inserer_icone(compteur, 'config');
                    SOM.Shortcuts.inserer_icone(compteur, 'map_arrows');
                    SOM.Shortcuts.deplace_barre(SOM.Shortcuts.getItem('POSITION', SOM.Shortcuts.POSITIONS.defaut)); //déplace la barre après le chargement de la page
                    SOM.Shortcuts.affectation_style();
                    if (heure_prochain_changement_marchand != "") {
                        SOM.Shortcuts.affiche_decompte_marchand();
                    }
                };

                SOM.Shortcuts.inserer_icone_image = function(compteur, identifiant, lien) {
                    var taille = SOM.Shortcuts.CADRE_image_carre;
                    var img = SOM.createElement($('menu_raccourcis'), 'img');
                    img.src = SOM.Shortcuts.ICONES[identifiant].image;
                    img.style.backgroundImage = 'url(' + SOM.Shortcuts.getItem('CASE', SOM.Shortcuts.ICONES.bag.image) + ')';
                    img.style.backgroundSize = taille + 'px ' + taille + 'px';
                    img.width = taille;
                    img.height = taille;
                    img.style.cursor = 'pointer';
                    img.style.zIndex = 2;
                    img.setAttribute('onclick', lien);
                    SOM.popup(img, AjaxWindow.possibleValues[SOM.Shortcuts.ICONES[identifiant].name]);
                    return img;
                };

                SOM.Shortcuts.ajoute_icone_Trader = function(compteur, identifiant) {
                    if (typeof(Trader) != "undefined") {
                        SOM.Shortcuts.inserer_icone_image(compteur, identifiant, 'Trader.open("' + identifiant + '", ' + Character.home_town.town_id + ');');
                    } else {
                        SOM.Shortcuts.ajoute_icone_building_vieux(compteur, identifiant);
                    }
                };

                SOM.Shortcuts.ajoute_icone_Hotel = function(compteur) {
                    if (typeof(HotelWindow) != "undefined") {
                        SOM.Shortcuts.inserer_icone_image(compteur, 'hotel', 'HotelWindow.open(' + Character.home_town.town_id + ');');
                    } else {
                        SOM.Shortcuts.ajoute_icone_building_vieux(compteur, 'hotel');
                    }
                };

                SOM.Shortcuts.ajoute_icone_Church = function(compteur) {
                    if (typeof(ChurchWindow) != "undefined") {
                        SOM.Shortcuts.inserer_icone_image(compteur, 'church', 'ChurchWindow.open(' + Character.home_town.town_id + ');');
                    } else {
                        SOM.Shortcuts.ajoute_icone_building_vieux(compteur, 'church');
                    }
                };

                SOM.Shortcuts.ajoute_icone_Mortician = function(compteur) {
                    if (typeof(MorticianWindow) != "undefined") {
                        SOM.Shortcuts.inserer_icone_image(compteur, 'mortician', 'MorticianWindow.open(' + Character.home_town.town_id + ');');
                    } else {
                        SOM.Shortcuts.ajoute_icone_building_vieux(compteur, 'mortician');
                    }
                };

                SOM.Shortcuts.ajoute_icone_Market = function(compteur) {
                    if (typeof(MarketWindow) != "undefined") {
                        SOM.Shortcuts.inserer_icone_image(compteur, 'market', 'MarketWindow.open(' + Character.home_town.town_id + ', 10);'); // Market level
                    } else {
                        SOM.Shortcuts.ajoute_icone_building_vieux(compteur, 'market');
                    }
                };

                SOM.Shortcuts.ajoute_icone_Crafting = function(compteur) {
                    var lien = "CharacterWindow.open();CharacterWindow.showTab('crafting');";
                    if (Character.profession != 0) {
                        var div_pts = SOM.createElement($('menu_raccourcis'), 'div');
                        div_pts.style.display = 'block';
                        div_pts.style.textAlign = 'center';
                        div_pts.style.verticalAlign = 'middle';
                        div_pts.style.position = 'absolute';
                        div_pts.style.zIndex = 3;
                        div_pts.style.left = (compteur * SOM.Shortcuts.CADRE_image_carre) + 'px';
                        div_pts.style.top = '0px';
                        div_pts.style.fontWeight = 'bolder';
                        div_pts.style.paddingTop = ((SOM.Shortcuts.CADRE_image_carre / 2) + 3) + 'px';
                        div_pts.style.color = 'white';
                        div_pts.style.width = SOM.Shortcuts.CADRE_image_carre + 'px';
                        div_pts.style.height = ((SOM.Shortcuts.CADRE_image_carre / 2) - 3) + 'px';
                        div_pts.style.cursor = 'pointer';
                        div_pts.onclick = function(e) {
                            CharacterWindow.open();
                            CharacterWindow.showTab('crafting');
                        };
                        div_pts.innerHTML = Character.profession_skill;
                        SOM.popup(div_pts, AjaxWindow.possibleValues[SOM.Shortcuts.ICONES.crafting.name]);
                    }

                    SOM.Shortcuts.inserer_icone_image(compteur, 'crafting', lien);
                };

                /**
                 * Ajouter un lien selon le vieux style (serveur v1.32 et avant).
                 */
                SOM.Shortcuts.ajoute_icone_building_vieux = function(compteur, identifiant) {
                    SOM.Shortcuts.inserer_icone_image(compteur, identifiant, 'AjaxWindow.show("' + SOM.Shortcuts.ICONES[identifiant].name + '", {town_id:' + Character.home_town.town_id + '}, ' + Character.home_town.town_id + ');')
                };

                SOM.Shortcuts.ajoute_fleche = function(compteur, lien_url) {
                    if ($('menu_raccourcis') == null) {
                        return;       //sort si pb
                    }

                    var menu_fleche = SOM.createElement($('menu_raccourcis'), 'a');
                    menu_fleche.href = lien_url;
                    menu_fleche.name = id_fleche_url;

                    //Création du contenu
                    var img = SOM.createElement(menu_fleche, 'img');
                    img.name = id_fleche_style;
                    img.src = SOM.Shortcuts.ICONES.empty.image;
                    img.style.backgroundImage = 'url(' + SOM.Shortcuts.ICONES.map_arrow.image + ')';
                    img.style.width = SOM.Shortcuts.CADRE_image_fleche + 'px';
                    img.style.height = SOM.Shortcuts.CADRE_image_fleche + 'px';
                    img.style.position = 'absolute';
                    img.style.zIndex = 2;
                    img.style.left = (compteur * SOM.Shortcuts.CADRE_image_carre) + 'px';
                    img.style.top = (SOM.Shortcuts.CADRE_image_carre - SOM.Shortcuts.CADRE_image_fleche) + 'px';
                };

                SOM.Shortcuts.fenetre_config_alterner_icone = function(identifiant, div) {
                    return function(e) {
                        var donnees = SOM.Shortcuts.getItem('ICONES');
                        donnees[identifiant] = (! donnees[identifiant])
                        SOM.setObject(SOM.Shortcuts.StorageNames['ICONES'], donnees);
                        div.style.border = SOM.Shortcuts.ICONES.BORDURE[donnees[identifiant]];
                        SOM.Shortcuts.generer_menu_raccourcis();
                    };
                };

                SOM.Shortcuts.fenetre_config_icones = function(div) {
                    var table, tbody, tr, td, img;

                    table = SOM.createElement(div, 'table');
                    table.width = '100%';
                    table.cellSpacing = 5;
                    table.cellPadding = 0;

                    tbody = SOM.createElement(table, 'tbody');

                    var icones;
                    if (Character.home_town == null) {
                        icones = SOM.Shortcuts.ICONES.SANS_VILLE;
                    } else {
                        icones = SOM.Shortcuts.ICONES.AVEC_VILLE;
                    }
                    var donnees = SOM.Shortcuts.getItem('ICONES');
                    for (var i = 0; i < icones.length; i++) {
                        if ((i % 8) == 0) {
                            tr = SOM.createElement(tbody, 'tr');
                        }

                        td = SOM.createElement(tr, 'td');

                        div = SOM.createElement(td, 'div');
                        div.style.width = SOM.Shortcuts.CADRE_image_carre + 'px';
                        div.style.height = SOM.Shortcuts.CADRE_image_carre + 'px';
                        div.style.border = SOM.Shortcuts.ICONES.BORDURE[donnees[icones[i]]];
                        div.style.cursor = 'pointer';
                        div.onclick = SOM.Shortcuts.fenetre_config_alterner_icone(icones[i], div);
                        SOM.popup(div, AjaxWindow.possibleValues[SOM.Shortcuts.ICONES[icones[i]].name]);

                        img = SOM.createElement(div, 'img');
                        img.src = SOM.Shortcuts.ICONES[icones[i]].image;
                        img.width = SOM.Shortcuts.CADRE_image_carre;
                        img.height = SOM.Shortcuts.CADRE_image_carre;
                        img.style.zIndex = '2';
                        img.style.backgroundImage = 'url(' + SOM.Shortcuts.ICONES.bag.image + ')';
                        img.style.backgroundSize = SOM.Shortcuts.CADRE_image_carre + 'px ' + SOM.Shortcuts.CADRE_image_carre + 'px';
                        //img.style.top = '-' + SOM.Shortcuts.CADRE_image_carre + 'px';
                    }
                };

                SOM.Shortcuts.fenetre_config = function() {
                    AjaxWindow.show('Configuration',
                            undefined,
                            SOM.Shortcuts.NUMERO_SCRIPT,
                            "", // Contenu vide, sera généré plus bas.
                            {title: '[SOM] TW - Raccourcis ' + SOM.Shortcuts.VERSION + ' : ' + AjaxWindow.possibleValues['settings']},
                            true);
                    $('window_Configuration_' + SOM.Shortcuts.NUMERO_SCRIPT + '_title').style.textAlign = 'center';

                    var div, table, tbody, tr, td, img;

                    div = SOM.createElement($('window_Configuration_' + SOM.Shortcuts.NUMERO_SCRIPT + '_content'), 'div');
                    div.style.overflow = 'auto';
                    div.style.height = '350px';

                    table = SOM.createElement(div, 'table');
                    table.width = '100%';
                    table.cellSpacing = '0';
                    table.cellPadding = '0';

                    tbody = SOM.createElement(table, 'tbody');

                    tr = SOM.createElement(tbody, 'tr');
                    tr.style.textAlign = 'center';

                    td = SOM.createElement(tr, 'td');
                    td.width = '30%';
                    td.innerHTML = '&nbsp;';

                    td = SOM.createElement(tr, 'td');

                    img = SOM.createElement(td, 'img');
                    img.src = SOM.Shortcuts.ICONES.bag.image;

                    td = SOM.createElement(tr, 'td');
                    td.style.verticalAlign = 'bottom';

                    img = SOM.createElement(td, 'img');
                    img.onclick = SOM.Shortcuts.inverse_menu_case(img);
                    img.name = 'IMG_Etat_icone_case';
                    img.style.cursor = 'pointer';
                    if (SOM.Shortcuts.getItem('CASE', SOM.Shortcuts.ICONES.bag.image) == SOM.Shortcuts.ICONES.empty.image) {
                        img.src = SOM.Shortcuts.ICONES.cancel.image;
                    } else {
                        img.src = SOM.Shortcuts.ICONES.ok.image;
                    }

                    td = SOM.createElement(tr, 'td');
                    td.width = '30%';
                    td.innerHTML = '&nbsp;';

                    td = SOM.createElement(tr, 'td');
                    td.style.border = SOM.Shortcuts.CADRE_BORDURE_DEFAUT;

                    img = SOM.createElement(td, 'img');
                    img.width = 73;
                    img.src = SOM.Shortcuts.ICONES.empty.image;

                    td = SOM.createElement(tr, 'td');
                    td.style.verticalAlign = 'bottom';

                    img = SOM.createElement(td, 'img');
                    img.name = 'IMG_Etat_bordure';
                    img.onclick = SOM.Shortcuts.inverse_menu_bordure(img);
                    img.style.cursor = 'pointer';
                    if (SOM.Shortcuts.getItem('BORDURE', SOM.Shortcuts.CADRE_BORDURE_DEFAUT) == "") {
                        img.src = SOM.Shortcuts.ICONES.cancel.image;
                    } else {
                        img.src = SOM.Shortcuts.ICONES.ok.image;
                    }

                    td = SOM.createElement(tr, 'td');
                    td.width = '30%';
                    td.innerHTML = '&nbsp;';

                    SOM.createElement(div, 'p');
                    SOM.createElement(div, 'hr');
                    SOM.createElement(div, 'p');

                    SOM.Shortcuts.fenetre_config_icones(div);
                };

                SOM.Shortcuts.ajoute_case_config = function(compteur) {
                    if ($('menu_raccourcis') == null) {
                        return;       //sort si pb
                    }

                    var taille = SOM.Shortcuts.CADRE_image_carre / 2;
                    var img = SOM.createElement($('menu_raccourcis'), 'img');
                    img.src = SOM.Shortcuts.ICONES.config.image;
                    img.width = taille;
                    img.height = taille;
                    img.onclick = SOM.Shortcuts.fenetre_config;
                    img.style.backgroundImage = 'url(' + SOM.Shortcuts.getItem('CASE', SOM.Shortcuts.ICONES.bag.image) + ')';
                    img.style.cursor = 'pointer';
                    img.style.position = 'absolute';
                    img.style.left = (compteur * SOM.Shortcuts.CADRE_image_carre) + 'px';
                    img.style.zIndex = 2;
                    SOM.popup(img, AjaxWindow.possibleValues['settings']);
                };

                SOM.Shortcuts.inverse_menu_bordure = function(img) {
                    return function(e) {
                        var cadre_bordure;
                        if (SOM.Shortcuts.getItem('BORDURE', SOM.Shortcuts.CADRE_BORDURE_DEFAUT) == '') {
                            cadre_bordure = SOM.Shortcuts.CADRE_BORDURE_DEFAUT;
                            img.src = SOM.Shortcuts.ICONES.ok.image;
                        } else {
                            cadre_bordure = "";
                            img.src = SOM.Shortcuts.ICONES.cancel.image;
                        }

                        //Stocke le contenu de la variable
                        SOM.setObject(SOM.Shortcuts.StorageNames['BORDURE'], cadre_bordure);

                        //Affichage
                        menu_raccourcis.style.border = SOM.Shortcuts.getItem('BORDURE', SOM.Shortcuts.CADRE_BORDURE_DEFAUT);
                    };
                };

                SOM.Shortcuts.inverse_menu_case = function(img) {
                    return function(e) {
                        var icone_case, menu_raccourcis, child;
                        if (SOM.Shortcuts.getItem('CASE', SOM.Shortcuts.ICONES.bag.image) == SOM.Shortcuts.ICONES.empty.image) {
                            icone_case = SOM.Shortcuts.ICONES.bag.image;
                            img.src = SOM.Shortcuts.ICONES.ok.image;
                        } else {
                            icone_case = SOM.Shortcuts.ICONES.empty.image;
                            img.src = SOM.Shortcuts.ICONES.cancel.image;
                        }

                        //Stocke le contenu de la variable
                        SOM.setObject(SOM.Shortcuts.StorageNames['CASE'], icone_case);

                        //Affichage
                        menu_raccourcis = $('menu_raccourcis');
                        for (var i = 0; i < menu_raccourcis.children.length; i++) {
                            child = menu_raccourcis.children[i];
                            if (child.tagName == 'IMG') {
                                child.style.backgroundImage = 'url(' + icone_case + ')';
                            }
                        }
                    };
                };

                SOM.Shortcuts.deplace_barre = function(position) {
                    if  (typeof(SOM.Shortcuts.POSITIONS[position]) == 'undefined') {
                        position = SOM.Shortcuts.POSITIONS.defaut;
                    }

                    SOM.setObject(SOM.Shortcuts.StorageNames['POSITION'], position);

                    var donnees = SOM.Shortcuts.POSITIONS[position];

                    //Changement du lien de la flèche
                    window.document.links[id_fleche_url].href = 'javascript:SOM.Shortcuts.deplace_barre("' + donnees.next + '");';
                    window.document[id_fleche_style].style.backgroundPosition = donnees.style;
                    SOM.Shortcuts.affectation_style();
                };

                SOM.Shortcuts.affectation_style = function() {
                    var menu_raccourcis, position, width, compteur, child;

                    menu_raccourcis = $('menu_raccourcis');
                    if (menu_raccourcis == null) {
                        return;
                    }

                    position = SOM.Shortcuts.getItem('POSITION', SOM.Shortcuts.POSITIONS.defaut);

                    compteur = 0;
                    for (var i = 0; i < menu_raccourcis.children.length; i++) {
                        child = menu_raccourcis.children[i];
                        if (child.tagName == 'IMG') {
                            compteur++;
                        }
                    }
                    width = (SOM.Shortcuts.CADRE_image_carre * (compteur - 0.5));

                    menu_raccourcis.setAttribute('style', SOM.Shortcuts.POSITIONS[position].position);
                    menu_raccourcis.style.border = SOM.Shortcuts.getItem('BORDURE', SOM.Shortcuts.CADRE_BORDURE_DEFAUT);
                    menu_raccourcis.style.position = 'absolute';
                    menu_raccourcis.style.zIndex = 2;
                    menu_raccourcis.style.height = SOM.Shortcuts.CADRE_image_carre + 'px';
                    menu_raccourcis.style.width = width + 'px';

                    if ((position == 'haut_centre') || (position == 'bas_centre')) {
                        menu_raccourcis.style.marginLeft = '-' + (width / 2) + 'px';
                    }

                    menu_raccourcis.setOpacity(0.7);
                };

                SOM.Shortcuts.ajoute_icone_marchand = function(compteur) {
                    //Affichage de l'icône
                    var lien_marchand;
                    if (typeof(Trader) != "undefined") {
                        lien_marchand = OUVRE_MARCHAND;
                    } else {
                        lien_marchand = OUVRE_MARCHAND_VIEUX;
                    }
                    span_marchand = SOM.Shortcuts.inserer_icone_image(compteur, 'merchant', lien_marchand);
                    span_marchand.id = 'icone_marchand';

                    //Le décompte est à nouveau un lien
                    var affichage_temps_marchand = SOM.createElement($('menu_raccourcis'), "div");
                    //Création du contenant
                    affichage_temps_marchand.id = 'temps_marchand';
                    affichage_temps_marchand.style.display = 'block';
                    affichage_temps_marchand.style.textAlign = 'center';
                    affichage_temps_marchand.style.verticalAlign = 'middle';
                    affichage_temps_marchand.style.position = 'absolute';
                    affichage_temps_marchand.style.zIndex = 3;
                    affichage_temps_marchand.style.left = (compteur * SOM.Shortcuts.CADRE_image_carre) + 'px';
                    affichage_temps_marchand.style.top = '0px';
                    affichage_temps_marchand.style.fontWeight = 'bolder';
                    affichage_temps_marchand.style.paddingTop = ((SOM.Shortcuts.CADRE_image_carre / 2) + 3) + 'px';
                    affichage_temps_marchand.style.color = 'white';
                    affichage_temps_marchand.style.width = SOM.Shortcuts.CADRE_image_carre + 'px';
                    affichage_temps_marchand.style.height = ((SOM.Shortcuts.CADRE_image_carre / 2) - 3) + 'px';
                    affichage_temps_marchand.style.cursor = 'pointer';
                    affichage_temps_marchand.setAttribute('onclick', lien_marchand);

                    //Vu que c'est un lien, on ajoute le commentaire
                    SOM.popup(affichage_temps_marchand, AjaxWindow.possibleValues[SOM.Shortcuts.ICONES.merchant.name]);
                }

                SOM.Shortcuts.affiche_decompte_marchand = function() {
                    //Calcul du delta entre l'heure actuelle et le prochain changement du marchand
                    var heure_actuelle = new Date().getTime() / 1000;
                    var difference = parseInt(heure_prochain_changement_marchand - heure_actuelle);

                    //Affectation de l'heure, minutes et secondes
                    var heures_virgule = difference / 3600;
                    var heures = parseInt(heures_virgule);
                    var minutes_virgule = (heures_virgule - heures) * 60;
                    var minutes = parseInt(minutes_virgule);
                    var secondes = Math.ceil((minutes_virgule - minutes) * 60);

                    var affichage_temps_marchand = $('temps_marchand');
                    if (affichage_temps_marchand == null) {
                        // Marchand non affiché.
                        return;
                    }

                    //Recherche de ce qu'il affiche
                    if (heures > 2) {
                        //Affichage de la bordure
                        affichage_temps_marchand.style.outline = "";

                        //Gère le "centrage"
                        var espace = "";
                        if (heures < 10) { var espace = "&nbsp;"; }

                        var duree_affichee = "&gt;&nbsp;" + espace + heures + " h";
                        var delai = (minutes * 60 + secondes) * 1000;
                    } else if (heures >= 1) {
                        //Affichage de la bordure
                        affichage_temps_marchand.style.outline = "thin dashed yellow";

                        var duree_affichee = "&gt;&nbsp;" + heures + "&nbsp;h";
                        var delai = (minutes * 60 + secondes) * 1000;
                    } else if (minutes >= 1) {
                        //Affichage de la bordure
                        affichage_temps_marchand.style.outline = "medium dotted orange";

                        //Gère le "centrage"
                        var espace = "";
                        minutes = minutes + 1; //Ajoute un +1 car 6 min correspond en fait à > 6 min donc 7 min
                        if (minutes < 10) { var espace = "&nbsp;"; }

                        var duree_affichee = espace + minutes + "&nbsp;min";
                        var delai = (secondes + 1) * 1000; //Si il reste 5 min 54 s, il déclenche dans 55 s
                    } else if (secondes > 0) {
                        //Affichage de la bordure
                        affichage_temps_marchand.style.outline = "thick solid red";

                        //Gère le "centrage"
                        var espace = "&nbsp;&nbsp;";
                        secondes = secondes + 1; //Ajoute un +1 car 6 s correspond en fait à > 6 s donc 7 s
                        if (secondes < 10) { var espace = "&nbsp;&nbsp;&nbsp;"; }

                        var duree_affichee = espace + secondes + "&nbsp;s";
                        var delai = 100;
                    } else {
                        var duree_affichee = "&nbsp;&nbsp;&nbsp;" + secondes + " s";
                        var delai = 5 * 1000; //Récup dans 5 s

                        //Ouverture du marchand
                        if (typeof(Trader) != "undefined") {
                            eval(OUVRE_MARCHAND);
                        } else {
                            eval(OUVRE_MARCHAND_VIEUX);
                        }

                        //Récupération de l'heure du marchand
                        setTimeout(SOM.Shortcuts.recup_tps_marchand, delai);
                    }

                    affichage_temps_marchand.innerHTML = duree_affichee;

                    //Redéclenche après le délai en millisecondes
                    setTimeout(SOM.Shortcuts.affiche_decompte_marchand, delai);
                }

                SOM.Shortcuts.init_langue = function() {
                    if (SOM.Shortcuts.getItem('ANNULER') == null) {
                        //Récupère le terme "annuler"
                        new Ajax('game.php?window=skill',
                                {
                                    method: 'post',
                                    data: {},
                                    onComplete: function(data) {
                                        //Récupération après skill_reskill_cancel_button
                                        SOM.setObject(SOM.Shortcuts.StorageNames['ANNULER'], data.match("skill_reskill_cancel_button.*button_middle.*>(\\w+)<.*button_right")[1]);
                                    }
                                }).request();
                    }

                    if (SOM.Shortcuts.getItem('CHERCHER') == null) {
                        //Récupère le terme "chercher"
                        new Ajax('game.php?window=ranking', {
                            method:'post',
                            data: {},
                            onComplete:function(data) {
                                    //Récupération après skill_reskill_cancel_button
                                    SOM.setObject(SOM.Shortcuts.StorageNames['CHERCHER'], data.match("Ranking.rank_choose.*button_middle.*>(\\w+)<.*button_right")[1]);
                                }
                            }).request();
                    }
                };

                SOM.Shortcuts.recup_tps_marchand = function() {
                    new Ajax('game.php?window=item_trader&action=index&h='+h,
                            {
                                method: 'post',
                                data: {},
                                onComplete: function(data) {
                                    if (typeof(Trader) == 'undefined') {
                                        var trouve = data.match("ItemTraderpage.setTime\\('(\\d+).*");
                                        if (trouve != null) {
                                            heure_prochain_changement_marchand = trouve[1];
                                            //Lance l'affichage du commentaire du marchand
                                            SOM.Shortcuts.affiche_decompte_marchand();
                                        }
                                    } else {
                                        var donnees = JSON.parse(data);
                                        heure_prochain_changement_marchand = donnees.time;
                                        SOM.Shortcuts.affiche_decompte_marchand();
                                    }
                                }
                            }).request();
                }

                SOM.Shortcuts.getItem = function(cle, defaut) {
                    // Try to get the data from the new name.
                    var new_data = SOM.getObject(SOM.Shortcuts.StorageNames[cle]);

                    if (new_data == null) {
                        // New variable name doesn't exist. Verify if the old name
                        // is present.
                        var old_data = SOM.getObject(SOM.Shortcuts.OldStorageNames[cle]);

                        if (old_data != null) {
                            // Value with the old name. Set with new name and
                            // erase old name.
                            SOM.setObject(SOM.Shortcuts.StorageNames[cle], old_data);
                            SOM.delObject(SOM.Shortcuts.OldStorageNames[cle]);
                            return old_data;
                        }

                        if (defaut) {
                            SOM.setObject(SOM.Shortcuts.StorageNames[cle], defaut);
                            return defaut;
                        }
                    }

                    return new_data;
                };


                //////////////////////////////////////////////////
                //
                //      PROGRAMME PRINCIPAL
                //
                //////////////////////////////////////////////////

                //Récupération de la partie "footer_menu_left" de la page initiale
                footer_menu_left = $('footer_menu_left');

                if (footer_menu_left) {
                    //Initialisation de la partie langue
                    SOM.Shortcuts.init_langue();

                    //Création du style
                    menu_raccourcis = document.createElement("div");
                    menu_raccourcis.id = "menu_raccourcis";
                    footer_menu_left.parentNode.insertBefore(menu_raccourcis, footer_menu_left.nextSibling);

                    SOM.Shortcuts.generer_menu_raccourcis();

                    //Récupération des informations du marchand
                    SOM.Shortcuts.recup_tps_marchand();

                    SOM.Tools.mettre_a_jour(SOM.Shortcuts.VERSION, SOM.Shortcuts.NUMERO_SCRIPT);
                }
            }

            try {
                window.addEvent('domready', programme_principal); //Lancement du programme principal une fois la page complètement chargée
            } catch(e) {
                alert(e)
            }
        }
    )
} else {
    //Cas du script exécuté dans l'iframe pour la mise à jour
    (
        function(f) {
            var s = document.createElement("script");
            s.type = "application/javascript";
            s.textContent = "(" + f.toString() + ")()";
            (document.body||document.head||document.documentElement).appendChild(s);
            s.parentNode.removeChild(s)
        }
    )(
        function() {
            var NUMERO_SCRIPT = "111503";

            function envoi_info() {
                var destination = window.parent;
                message = String(escape(document.body.textContent));

                //Indiquer le n° du script pour identifier la communication
                if (destination.postMessage) {
                    destination.postMessage(NUMERO_SCRIPT + message, '*');
                }
            }

            envoi_info();
        }
    )
}
